#include <iostream>
#include <random>
#include <ctime>
#include <Accelerate/Accelerate.h>

void fill_random_matrix(float* matrix, int n) {
    std::random_device rd;  // 获取随机数生成器的种子
    std::mt19937 gen(rd()); // 使用梅森旋转算法生成随机数
    std::uniform_real_distribution<> dis(0.0f, 1.0f); // 生成 [0, 1) 范围的随机数

    for (int i = 0; i < n * n; ++i) {
        matrix[i] = dis(gen); // 填充矩阵
    }
}

void test_openblas_matrix_multiplication(int n) {
    // 使用 vector 动态分配矩阵
    std::vector<float> A(n * n);
    std::vector<float> B(n * n);
    std::vector C(n * n, 0.0f); // 初始化 C 矩阵为 0

    // 用随机数填充矩阵 A 和 B
    fill_random_matrix(A.data(), n);
    fill_random_matrix(B.data(), n);

    // 开始计时
    clock_t start = clock();

    // 进行矩阵乘法 C = A * B
    cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,
                n, n, n,
                1.0f, A.data(), n,
                B.data(), n,
                0.0f, C.data(), n);

    // 结束计时
    clock_t end = clock();

    // 计算并输出耗时
    double time_spent = (double)(end - start) / CLOCKS_PER_SEC;
    std::cout << "Time taken for " << n << " x " << n << " matrix multiplication: "
              << time_spent << " seconds" << std::endl;
}

int main() {
    int n = 1024; // 根据需要修改矩阵的大小
    test_openblas_matrix_multiplication(n);
    return 0;
}
